package com.dimples.dd.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.dimples.dd.common.model.Option;
import com.dimples.dd.common.pojo.PageResult;
import com.dimples.dd.system.model.entity.SystemRoleDO;
import com.dimples.dd.system.model.form.RoleForm;
import com.dimples.dd.system.model.query.RolePageQuery;
import com.dimples.dd.system.model.vo.RolePageVO;

import java.util.Collection;
import java.util.List;
import java.util.Set;

public interface SystemRoleService extends IService<SystemRoleDO> {

    /**
     * 角色下拉列表
     *
     * @return {@link List<Option>} – 角色下拉列表
     */
    List<Option<String>> listRoleOptions();

    /**
     * 角色分页列表
     *
     * @param queryParams 角色查询参数
     * @return {@link PageResult<RolePageVO>} – 角色分页列表
     */
    PageResult<RolePageVO> getRolePage(RolePageQuery queryParams);

    /**
     * 获得角色，从缓存中
     *
     * @param id 角色编号
     * @return 角色
     */
    SystemRoleDO getRoleFromCache(Long id);

    /**
     * 保存角色
     *
     * @param roleForm 角色表单数据
     * @return {@link Boolean}
     */
    boolean createRole(RoleForm roleForm);

    /**
     * 修改角色
     *
     * @param roleForm 角色表单数据
     * @return {@link Boolean}
     */
    boolean updateRole(RoleForm roleForm);

    /**
     * 获取角色表单数据
     *
     * @param roleId 角色ID
     * @return {@link RoleForm} – 角色表单数据
     */
    RoleForm getRoleForm(Long roleId);

    /**
     * 通过code获取id
     *
     * @param roles 凑得集合
     * @return id集合
     */
    List<Long> listIdsByCodes(List<String> roles);

    /**
     * 修改角色状态
     *
     * @param roleId 角色ID
     * @param status 角色状态(1:启用；0:禁用)
     * @return {@link Boolean}
     */
    boolean updateRoleStatus(Long roleId, Integer status);

    /**
     * 批量删除角色
     *
     * @param ids 角色ID，多个使用英文逗号(,)分割
     * @return {@link Boolean}
     */
    boolean deleteRoles(String ids);

    /**
     * 获得角色列表
     *
     * @param ids 角色编号数组
     * @return 角色列表
     */
    List<SystemRoleDO> getRoleList(Collection<Long> ids);

    /**
     * 判断角色编号数组中，是否有管理员
     *
     * @param roleIds 角色编号数组
     * @return 是否有管理员
     */
    boolean hasAnySuperAdmin(Set<Long> roleIds);
}
